package com.lp.multi.thread.example06;

/**
 * @author: lp
 * @create: 2021-06-24 7:23
 * @description: 线程协作，生产者消费者模式--信号灯法
 */
public class ThreadTeamWorkTest2 {
    public static void main(String[] args) {
        TV tv = new TV();
        new Producter2(tv).start();
        new Customer2(tv).start();

    }
}


/**
 * 生产者
 */
class Producter2 extends Thread{
    private TV tv;
    public Producter2(TV tv){
        this.tv = tv;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                return;
            }
            try {
                    tv.push(new TV());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }



}

/**
 * 消费者
 */
class Customer2 extends  Thread {
    private TV tv;
    public Customer2(TV tv){
        this.tv = tv;
    }

    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                return;
            }
            try {
                tv.pop();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

/**
 * 生成电视节目
 */
class TV{
    private boolean isProducterFlag=true;


    public synchronized void push(TV goods) throws InterruptedException {
        while(!isProducterFlag){
            //队列满了，生产者等待
            System.out.println(Thread.currentThread().getName()+"暂停,生产太快，消费者来不及消费");
            //wait会释放锁，进入无限等待至被其他线程唤醒。
            // wait必须放到死循环中，每次线程被唤醒后，需要重新判断wail循环条件.被唤醒进入的方法的线程只有一个。
            this.wait();
        }

        System.out.println(Thread.currentThread().getName()+"生产了一个");
        //有商品了，通知消费者消费
        isProducterFlag = false;
        notify();
    }

    public synchronized void pop() throws InterruptedException {
        while(isProducterFlag){
            //等待有产品
            System.out.println(Thread.currentThread().getName()+"消费太快，来不及生产");
            this.wait();
        }
        System.out.println(Thread.currentThread().getName()+"消费了一个" );
        //如果消费了，通知生产者生产
        isProducterFlag = true;
        notifyAll();
    }
}
